/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package dominio;

import disco.HandlerDisk;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author halt
 */
public class GestorClientes implements Serializable{

    private List<Cliente> listCliente;
    HandlerDisk hd;

    public GestorClientes() {
        listCliente = new ArrayList<Cliente>();
        hd = new HandlerDisk();
    }

    public List<Cliente> getTodosClientes () {
        return this.listCliente;
    }

    public boolean addCliente(Cliente c){
        boolean enc = false;
        int n = listCliente.size();
        c.setNumCliente(getLastNumCliente()+1);//WARNING
        for (int i = 0; i < n & !enc; ++i) {
            enc = (listCliente.get(i).getNumCliente() == c.getNumCliente());
        }
        if (!enc) listCliente.add(c);
        return enc;
    }

    public int getLastNumCliente() {
        int n = listCliente.size();
        if (n == 0) return n+1;
        else return listCliente.get(n-1).getNumCliente();
    }
    
    public List<Cliente> buscarClienteNombre(String nombre){
        int n = listCliente.size();
        List<Cliente> lc = new ArrayList<Cliente>();
        boolean enc = false;
        for (int i = 0; i < n; ++i) {
            enc = (nombre.equals(listCliente.get(i).getNombre()));
            if (enc) {
                lc.add(listCliente.get(i));
                enc = false;
            }
        }
        return lc;
    }


    public List<Cliente> buscarClienteApellido1(String apellido1){
        int n = listCliente.size();
        List<Cliente> lc = new ArrayList<Cliente>();
        boolean enc = false;
        for (int i = 0; i < n; ++i) {
            enc = (apellido1.equals(listCliente.get(i).getApellido1()));
            if (enc){
                lc.add(listCliente.get(i));
                enc = false;
            }
        }
        return lc;
    }

    public Cliente buscarCliente(int numCliente){
        boolean enc = false;
        int n = listCliente.size();
        Cliente aux = null;
        for (int i = 0; i < n & !enc; ++i) {
            if (listCliente.get(i).getNumCliente() == numCliente) {
                aux = listCliente.get(i);
            }
        }
        return aux;
    }

    private List<Cliente> filtrado(List<Cliente> original) {
        List<Cliente> lfiltrado = new ArrayList<Cliente>();
        int n = original.size();
        if (n > 0) {
            int numCliente = original.get(0).getNumCliente();
            lfiltrado.add(original.get(0));
            for (int i = 1; i < n; ++i) {
                if (numCliente != original.get(i).getNumCliente()){
                    lfiltrado.add(original.get(i));
                }
                numCliente = original.get(i).getNumCliente();
            }
        }
        return lfiltrado;
    }

    public Cliente buscarNumTelefono(int numTelf){
        int n = this.listCliente.size();
        boolean trobat = false;
        Cliente c = null;
        int i;
        for (i = 0; i < n && !trobat; ++i) {
            trobat = (this.listCliente.get(i).getTelefono() == numTelf);
        }
        if(trobat) c = this.listCliente.get(i);
        return c;
    }

    public List<Cliente> buscarClienteNombreApellido1(String nombre, String apellido1){
        List<Cliente>lcn = buscarClienteNombre(nombre);
        List<Cliente>lca1 = buscarClienteApellido1(apellido1);
        List<Cliente>lc = new ArrayList<Cliente>();
        int n = lcn.size();
        int m = lca1.size();
        for (int i= 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (lcn.get(i).getApellido1().equals(lca1.get(j).getApellido1())) {
                    lc.add(lcn.get(i));
                }
            }
        }
        System.out.println(lc.get(0).getApellido1());
        return filtrado(lc);
    }

    public boolean borrarCliente(int numCliente){
        boolean trobat = false;
        int n = listCliente.size();
        for (int i = 0; i < n && !trobat; ++i) {
            if(numCliente == listCliente.get(i).getNumCliente()) {
                removeCliente(listCliente.get(i));
                trobat = true;
            }
        }
        guardarGestorClientes();
        return trobat;
    }

    private boolean removeCliente(Cliente c){
        return listCliente.remove(c);
    }

    public void guardarGestorClientes() {
        hd.salvarClientes(this);
    }

    public GestorClientes cargarGestorClientes() throws FileNotFoundException, IOException, ClassNotFoundException,NullPointerException {
        return hd.cargarClientes();
    }

}
